function isObject(obj) {
  return typeof obj === 'object' && obj !== null
}

// WeakMap是一种特殊类型的Map，它允许将对象作为键存储，
// 而不会阻止这些对象被垃圾回收器回收。这对于处理循环引用或缓存等场景非常有用。
let toProxy = new WeakMap() // 原对象：代理过的对象
// let toRaw = new WeakSet() // 代理过的对象: 原对象
 

function reactive(target) { // 返回一个响应式的对象
  return createReactiveObject(target)
}

function createReactiveObject(target) { // 把对象变成响应式
  if (!isObject(target)) {
    return target
  }

  // target是否已经被代理过了，如果已经被代理过了，就不要再次代理了
  let isProxy = toProxy.get(target)
  if (isProxy) {
    return isProxy
  }

  let handler = {
    get(target, key, receiver) {
      console.log('获取');
      // return target[key]
      let result = Reflect.get(target, key, receiver)
      return isObject(result) ? reactive(result) : result // 递归
    },
    set(target, key, value, receiver) {
      // 对象里是否存在一样的key
      let hasKey = target.hasOwnProperty(key)
      let oldValue = target[key]

      if (!hasKey) {
        console.log('新增');
      } else if (oldValue !== value) {
        console.log('修改');
      }
      if (oldValue !== value) {
        // 设置代理对象中的值
        let res = Reflect.set(target, key, value, receiver)
        updateView()
        return res
      }
    }
  }

  let proxy = new Proxy(target, handler)
  toProxy.set(target, proxy)
  // toRaw.add(proxy, target)
  return proxy
}





let data = {
  name: '红红',
  age: {
    num: 18
  },
  job: ['corder', 'driver']
}
let state = reactive(data)
state.age.num = 19
// state.job.push('teacher') // push length+1
// state.job.length = 3
// console.log(state.job);


// let state1 = reactive(state) // 无意义
// let state2 = reactive(state1)
// state1.age.num = 19










function updateView() {
  console.log('视图更新')
}